const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const ffmpeg = require('fluent-ffmpeg');

class ImagesToGifConverter {
  constructor(config) {
    this.config = config;
  }

  // 配置ffmpeg路径
  configureFfmpeg(defaultPath) {
    // 优先使用用户提供的路径，如果没有则使用默认路径
    this.ffmpegPath = this.config.ffmpegPath || defaultPath;
    if (this.ffmpegPath) {
      ffmpeg.setFfmpegPath(this.ffmpegPath);
    }
  }

  // 获取目录下的所有图片文件并按名称排序
  getSortedImages() {
    if (!fs.existsSync(this.config.framesDir)) {
      throw new Error(`图片目录不存在: ${this.config.framesDir}`);
    }

    // 读取目录中的所有图片文件，支持更多格式
    const files = fs.readdirSync(this.config.framesDir)
      .filter(file => /\.(jpg|jpeg|png|bmp|gif|tiff|tif|webp)$/i.test(file))
      .sort((a, b) => {
        // 按文件名称排序，确保帧顺序正确
        return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
      });

    if (files.length === 0) {
      throw new Error(`目录中没有图片文件: ${this.config.framesDir}`);
    }

    return files;
  }

  // 将图片转换为GIF
  convertToGif(mainWindow) {
    return new Promise((resolve, reject) => {
      try {
        const images = this.getSortedImages();

        // 确保输出目录存在
        if (!fs.existsSync(this.config.outputDir)) {
          fs.mkdirSync(this.config.outputDir, { recursive: true });
        }

        // 获取第一张图片的信息
        const firstImage = images[0];
        const imageExt = path.extname(firstImage).toLowerCase();
        const imagePath = path.join(this.config.framesDir, firstImage);

        // 生成GIF文件名
        let gifName;
        if (this.config.outputName) {
          gifName = this.config.outputName + '.gif';
        } else {
          gifName = path.basename(firstImage, path.extname(firstImage)) + '.gif';
        }
        const outputGif = path.join(this.config.outputDir, gifName);

        // 计算实际帧率（考虑速度倍率）
        const actualFps = Math.max(1, this.config.frameRate * this.config.speed);

        console.log('原始图片路径:', imagePath);
        console.log('缩放配置:', this.config.scale);

        // 使用简单的scale，会按比例缩放（可能缩小或放大）
        const scaleFilter = `scale=${this.config.scale}:flags=lanczos`;

        console.log('scale滤镜:', scaleFilter);

        // 创建输入文件列表文本
        const fileListPath = path.join(this.config.outputDir, 'filelist.txt');
        const fileListContent = images.map(img => {
          const imgPath = path.join(this.config.framesDir, img).replace(/\\/g, '/');
          return `file '${imgPath}'\nduration ${1/actualFps}`;
        }).join('\n');
        fs.writeFileSync(fileListPath, fileListContent);

        console.log('图片数量:', images.length);
        console.log('帧率:', actualFps);
        console.log('输出路径:', outputGif);

        // 创建ffmpeg命令
        const gifCommand = ffmpeg();
        if (this.ffmpegPath) {
          gifCommand.setFfmpegPath(this.ffmpegPath);
        }

        gifCommand
          .input(fileListPath)
          .inputOptions([
            '-f', 'concat',
            '-safe', '0'
          ])
          .outputOptions([
            '-vf', `fps=${actualFps},${scaleFilter},split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse`,
            '-loop', '0',
            '-y'
          ])
          .output(outputGif)
          .on('start', commandLine => {
            console.log('FFmpeg命令:', commandLine);
          })
          .on('progress', progress => {
            console.log('进度:', progress);
            if (mainWindow && progress.frames) {
              const percent = Math.min(100, Math.round((progress.frames / images.length) * 100));
              mainWindow.webContents.send('progress-update', {
                type: 'images-to-gif',
                progress: percent
              });
            }
          })
          .on('end', () => {
            // 清理临时文件
            try {
              fs.unlinkSync(fileListPath);
            } catch (e) {
              console.error('清理临时文件失败:', e);
            }

            // 检查输出文件是否存在且大小大于0
            if (fs.existsSync(outputGif) && fs.statSync(outputGif).size > 0) {
              resolve({ success: true, message: 'GIF创建完成', outputPath: outputGif });
            } else {
              reject(new Error('GIF文件创建失败或文件为空'));
            }
          })
          .on('error', (err, stdout, stderr) => {
            console.error('FFmpeg错误:', err);
            console.error('stdout:', stdout);
            console.error('stderr:', stderr);

            // 清理临时文件
            try {
              fs.unlinkSync(fileListPath);
            } catch (e) {}

            reject(err);
          })
          .run();
      } catch (error) {
        reject(error);
      }
    });
  }
}

// 导出类
module.exports = ImagesToGifConverter;